#include "systick_counter.hpp"

#include <cstdint>

namespace scheduler_basic {

    volatile uint32_t global_variable_ticks_per_milli_second;

    volatile uint32_t global_variable_ticks_per_micro_second;

    volatile uint32_t global_variable_ms_counter;

    volatile uint32_t global_variable_us_counter;

}  // namespace scheduler_basic


extern "C" {

/**
 * @brief 在SysTick 中断里调用，更新毫秒计数器及精度补偿变量
 * 
 * 这个函数必须放在命名空间外面，不然定义在.c 文件里的ISR 程序没办法调用。
 *
 */
void scheduler_basic_systick_counter_inc_counter_from_isr() {
    using namespace scheduler_basic;
    // 毫秒和微秒用两个计数变量
    // systick 中断优先级最低，被打断可能造成奇怪的BUG，所以最好是先关掉中断
    
    __disable_irq();
    
    global_variable_ms_counter += SYS_TICK_CYCLE_N_MS;
    global_variable_us_counter += SYS_TICK_CYCLE_N_MS * 1000;
    
    __enable_irq();
}

}